﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NesEmulatorX.Util
{
	public static class Binary
	{
		#region Public Static Methods

		public static byte Bit1(byte b)
		{
			return (byte)((b & 0x80) >> 7);
		}

		public static byte Bit2(byte b)
		{
			return (byte)((b & 0x40) >> 6);
		}

		public static byte Bit3(byte b)
		{
			return (byte)((b & 0x20) >> 5);
		}

		public static byte Bit4(byte b)
		{
			return (byte)((b & 0x10) >> 4);
		}

		public static byte Bit5(byte b)
		{
			return (byte)((b & 0x08) >> 3);
		}

		public static byte Bit6(byte b)
		{
			return (byte)((b & 0x04) >> 2);
		}

		public static byte Bit7(byte b)
		{
			return (byte)((b & 0x02) >> 1);
		}

		public static byte Bit8(byte b)
		{
			return (byte)(b & 0x01);
		}

		public static byte SetBit1(byte b)
		{
			return (byte)(b | 0x80);
		}

		public static byte SetBit2(byte b)
		{
			return (byte)(b | 0x40);
		}

		public static byte SetBit3(byte b)
		{
			return (byte)(b | 0x20);
		}

		public static byte SetBit4(byte b)
		{
			return (byte)(b | 0x10);
		}

		public static byte SetBit5(byte b)
		{
			return (byte)(b | 0x08);
		}

		public static byte SetBit6(byte b)
		{
			return (byte)(b | 0x04);
		}

		public static byte SetBit7(byte b)
		{
			return (byte)(b | 0x02);
		}

		public static byte SetBit8(byte b)
		{
			return (byte)(b | 0x01);
		}

		public static byte UnsetBit1(byte b)
		{
			return (byte)(b & ~0x80);
		}

		public static byte UnsetBit2(byte b)
		{
			return (byte)(b & ~0x40);
		}

		public static byte UnsetBit3(byte b)
		{
			return (byte)(b & ~0x20);
		}

		public static byte UnsetBit4(byte b)
		{
			return (byte)(b & ~0x10);
		}

		public static byte UnsetBit5(byte b)
		{
			return (byte)(b & ~0x08);
		}

		public static byte UnsetBit6(byte b)
		{
			return (byte)(b & ~0x04);
		}

		public static byte UnsetBit7(byte b)
		{
			return (byte)(b & ~0x02);
		}

		public static byte UnsetBit8(byte b)
		{
			return (byte)(b & ~0x01);
		}

		public static byte UpperNibble(byte b)
		{
			return (byte)((b & 0xF0) >> 4);
		}

		public static byte LowerNibble(byte b)
		{
			return (byte)(b & 0x0F);
		}

		#endregion
	}
}
